package io.github.talelin.latticy.service.impl;

import io.github.talelin.latticy.service.IdGeneratorService;
import io.github.talelin.latticy.util.DateTool;
import io.github.talelin.latticy.util.JedisUtils;
import org.springframework.stereotype.Service;
import java.util.Date;

/**
 * @authoer:wulongbo
 * @createDate:2022/7/5
 * @description:
 */
@Service
public class JedisIdGeneratorServiceImpl implements IdGeneratorService {

    /**
     * @return
     * @Description 生成分布式ID
     */
    @Override
    public String generatorId(String prefix) {
        return incrOrderId(prefix, DateTool.toDate(new Date()));
    }

    /**
     * @param prefix
     * @return
     * @Description 支持一个小时100w个订单号的生成
     */
    private String incrOrderId(String prefix, String date) {
        try {
            Long index = JedisUtils.hmIncrBy(date, prefix, 1L);
            if (index == 1) {
                // 设置过期时间   当key过期时，重新加载并设置过期时间，再加 10分钟 防止切换时出错
                Long expireTime = DateTool.getBeforeDayConvertSecond() + 600;
                JedisUtils.expire(prefix, expireTime.intValue());
            }
            if (index != null && index > 0) {
                return this.getNextID(prefix, date, index);
            }
        } catch (Exception ex) {
            System.out.println("分布式订单号生成失败异常。。。。。");
        }
        return prefix.concat(date);
    }

    /**
     * 获取下一个ID
     *
     * @param index 序号
     * @return String
     */
    public String getNextID(String prefix, String date, long index) {
        StringBuffer buff = new StringBuffer();
        buff.append(prefix);
        buff.append(date);
        buff.append(String.format("%04d", index));
        return buff.toString();
    }

}
